// 开启严格模式
'use strict';

// 上传资源路径
var UPLOADS = '';
// 上传地址
var UPLOADURL = '';
// 提示类名
var PROMPT = '.modal_frame-form-prompt';
var SHOW = 'down';
// 成功类名
var SUCCESS = 'success';
// 错误类名
var ERROR = 'error';
// 请求类型
var METHOD = '';
// 请求地址
var URL = '';

/**
 * 初始化
 * @return void
 */
(function init() {
    // 变化校验
    changeRules('check');
})()

/**
 * 设置配置
 * @param {Object} config 配置
 * @return void
 */
function setConfig(config) {
    // 设置上传资源路径
    UPLOADS = config.UPLOADS;
    // 设置上传地址
    UPLOADURL = config.UPLOADURL;
}

/**
 * 重置表单
 * @return void
 */
function resetForm() {
    // 删除预览图
    $('#preview_img').remove();
    // 删除旧图片名
    $('#old_img').remove();
    // 重置表单
    $('.modal_frame-form')[0].reset();
}

/**
 * 变化校验
 * @param {String} operation 操作
 * @return void
 */
function changeRules(operation) {
    // 上传
    var file = $('#file');
    // 链接
    var url = $('#url');
    var urlPattern = /^((https|http|ftp|rtsp|mms){1}:\/\/)(www.)?[A-Za-z0-9.\/?=&-]+$/;
    // 标题/描述
    var title = $('#title');
    var describe = $('#describe');
    var _pattern = /^.+$/;

    switch (operation) {
        // 校验
        case 'check':
            // 上传校验
            file.change(function () {
                if ($(this).eq(0).prop('files').length) {
                    $(this).siblings(PROMPT).removeClass(SHOW);
                    $(this).removeClass(ERROR).addClass(SUCCESS);
                } else {
                    if (!$('#preview_img').length) {
                        $(this).siblings(PROMPT).text('请上传图片').addClass(SHOW);
                        $(this).removeClass(SUCCESS).addClass(ERROR);
                    } else {
                        $(this).siblings(PROMPT).removeClass(SHOW);
                        $(this).removeClass(ERROR).addClass(SUCCESS);
                    }
                }
            })
            
            // 链接校验
            url.bind('input propertychange blur', function () {
                if ($(this).val() === '') {
                    $(this).siblings(PROMPT).removeClass(SHOW);
                    $(this).removeClass(ERROR).addClass(SUCCESS);
                } else if (!urlPattern.test($(this).val())) {
                    $(this).siblings(PROMPT).text('请输入正确的链接地址').addClass(SHOW);
                    $(this).removeClass(SUCCESS).addClass(ERROR);
                } else {
                    $(this).siblings(PROMPT).removeClass(SHOW);
                    $(this).removeClass(ERROR).addClass(SUCCESS);
                }
            })

            // 标题校验
            title.bind('input propertychange blur', function () {
                if ($(this).val() === '') {
                    $(this).siblings(PROMPT).removeClass(SHOW);
                    $(this).removeClass(ERROR).addClass(SUCCESS);
                } else if (!_pattern.test($(this).val())) {
                    $(this).siblings(PROMPT).text('标题不能输入换行符').addClass(SHOW);
                    $(this).removeClass(SUCCESS).addClass(ERROR);
                } else {
                    $(this).siblings(PROMPT).removeClass(SHOW);
                    $(this).removeClass(ERROR).addClass(SUCCESS);
                }
            })

            // 描述校验
            describe.bind('input propertychange blur', function () {
                if ($(this).val() === '') {
                    $(this).siblings(PROMPT).removeClass(SHOW);
                    $(this).removeClass(ERROR).addClass(SUCCESS);
                } else if (!_pattern.test($(this).val())) {
                    $(this).siblings(PROMPT).text('描述不能输入换行符').addClass(SHOW);
                    $(this).removeClass(SUCCESS).addClass(ERROR);
                } else {
                    $(this).siblings(PROMPT).removeClass(SHOW);
                    $(this).removeClass(ERROR).addClass(SUCCESS);
                }
            })
            break;
        // 重置校验
        case 'reset':
            // 重置上传
            file.removeClass(SUCCESS + ' ' + ERROR);
            file.siblings(PROMPT).removeClass(SHOW);
            // 重置链接
            url.removeClass(SUCCESS + ' ' + ERROR);
            url.siblings(PROMPT).removeClass(SHOW);
            // 重置标题
            title.removeClass(SUCCESS + ' ' + ERROR);
            title.siblings(PROMPT).removeClass(SHOW);
            // 重置描述
            describe.removeClass(SUCCESS + ' ' + ERROR);
            describe.siblings(PROMPT).removeClass(SHOW);
            // 重置表单
            resetForm();
            break;
    }
}

/**
 * 校验
 * @return void
 */
function rules() {
    // 校验结果
    var result = true;
    // 上传
    var file = $('#file');
    // 链接
    var url = $('#url');
    var urlPattern = /^((https|http|ftp|rtsp|mms){1}:\/\/)(www.)?[A-Za-z0-9.\/?=&-]+$/;
    // 标题/描述
    var title = $('#title');
    var alt = $('#alt');
    var _pattern = /^.+$/;

    // 上传校验
    if (file.eq(0).prop('files').length) {
        title.addClass(SUCCESS);
    } else {
        if (!$('#preview_img').length) {
            file.siblings(PROMPT).text('请上传图片').addClass(SHOW);
            file.removeClass(SUCCESS).addClass(ERROR);
            result = false;
        } else {
            file.siblings(PROMPT).removeClass(SHOW);
            file.removeClass(ERROR).addClass(SUCCESS);
        }
    }
    
    // 链接校验
    if (url.val() === '') {
        url.addClass(SUCCESS);
    } else if (!urlPattern.test(url.val())) {
        url.siblings(PROMPT).text('请输入正确的链接格式').addClass(SHOW);
        url.addClass(ERROR);
        result = false;
    } else {
        url.addClass(SUCCESS);
    }

    // 标题校验
    if (title.val() === '') {
        title.addClass(SUCCESS);
    } else if (!_pattern.test(title.val())) {
        title.siblings(PROMPT).text('标题不能输入换行符').addClass(SHOW);
        title.addClass(ERROR);
        result = false;
    } else {
        title.addClass(SUCCESS);
    }

    // 描述校验
    if (alt.val() === '') {
        alt.addClass(SUCCESS);
    }else if (!_pattern.test(alt.val())) {
        alt.siblings(PROMPT).text('标题不能输入换行符').addClass(SHOW);
        alt.addClass(ERROR);
        result = false;
    } else {
        alt.addClass(SUCCESS);
    }

    // 错误元素
    var error = $('#form-modal_frame .' + ERROR).eq(0);
    // 获取焦点
    error.focus();

    // 返回校验结果
    return result;
}

/**
 * 添加
 * @return void
 */
function add(url) {
    // 如果请求是PUT类型/重置变化校验
    if (METHOD === 'put') changeRules('reset');
    // 设置请求类型
    METHOD = 'post';
    // 设置请求地址
    URL = url;
    // 显示模态框
    showModalFrame('#form-modal_frame', '.form-modal_frame-container', '.form-modal_frame-title', true);
}

/**
 * 编辑
 * @param {Object} _this 当前DOM
 * @param {String} url 地址
 * @return void
 */
function edit(_this, url) {
    // 设置请求类型
    METHOD = 'put';
    // 设置请求地址
    URL = url;
    // 添加加载
    actionLoading(_this, 'add', 'icon');
    // 请求数据
    axios.get(URL).then(function (res) {
        // 删除加载
        actionLoading(_this, 'remove', 'icon');
        // 重置变化校验
        changeRules('reset');
        // 设置图片标签
        var img = '<img id="preview_img" src="' + UPLOADS + res.data.data.img + '" alt="' + res.data.data.alt + '" title="' + res.data.data.title + '" old-img="' + UPLOADS + res.data.data.img + '" />';
        // 追加图片
        $('#form-modal_frame .modal_frame-form-item.rectangle').append(img);
        // 设置链接
        $('#url').val(res.data.data.url);
        // 设置打开方式
        $('#target_' + res.data.data.target).prop('checked', true);
        // 设置标题
        $('#title').val(res.data.data.title);
        // 设置描述
        $('#alt').val(res.data.data.alt);
        // 设置旧图片名
        var old_img = '<input id="old_img" type="hidden" name="old_img" value="' + res.data.data.img + '" />';
        // 追加旧图片名
        $('#form-modal_frame .modal_frame-form').append(old_img);
        // 显示模态框
        showModalFrame('#form-modal_frame', '.form-modal_frame-container', '.form-modal_frame-title', true);
    }).catch(function (err) {
        // 消息提示
        message('add', 'error', err);
        // 删除加载
        actionLoading(_this, 'remove', 'icon');
    })
    
}

/**
 * 提交
 * @param {Object} _this 当前DOM
 * @return void
 */
function onSubmit(_this) {
    // 检验
    if (rules()) {
        // 文件
        var file = $('#file');
        // 获取FILE文件
        var files = file.eq(0).prop('files');
        // 判断FILE文件数量
        if (files.length) {
            // 添加加载
            actionLoading(_this, 'add', 'submit');
            // 上传
            upload(_this, files, function (res) {
                // 判断是否上传成功
                res.data.state === 200 ? request(_this, res.data.fileName) : message('add', res.data.type, res.data.message);
            });
        } else {
            if (METHOD === 'post') {
                // 消息提示
                message('add', 'error', '请上传图片');
            } else {
                // 添加加载
                actionLoading(_this, 'add', 'submit');
                // 请求
                request(_this);
            }
        }
    }
}

/**
 * 上传
 * @param {Object} _this 当前DOM
 * @param {Object} files files对象
 * @param {Function} callback 回调函数
 * @return void
 */
function upload(_this, files, callback) {
    // 旧图片
    var old_img = $('#old_img');
    // 实例化表单数据
    var file = new FormData();
    // 追加文件
    file.append('file', files[0]);
    // 判断是否有旧图片
    if (old_img.length) file.append('old_img', old_img.val());
    // 上传文件
    axios.post(UPLOADURL, file).then(function (res) {
        // 执行回调函数
        callback(res);
    }).catch(function (err) {
        // 消息提示
        message('add', 'error', err);
        // 删除加载
        actionLoading(_this, 'remove', 'submit');
    })
}

/**
 * 请求
 * @param {Object} _this 当前DOM
 * @param {String} imgName 图片名称
 * @return void
 */
function request(_this, imgName) {
    // 获取数据
    var data = {
        url: $('#url').val(),
        target: $('[name="target"]:checked').val(),
        title: $('#title').val(),
        alt: $('#alt').val(),
    };
    // 判断是否有图片
    if (imgName) data.img = imgName;

    // 发送请求
    axios({
        method: METHOD,
        url: URL,
        data: data
    }).then(function (res) {
        // 消息提示
        message('add', res.data.type, res.data.message);
        // 删除加载
        actionLoading(_this, 'remove', 'submit');
        // 判断是否操作成功
        if (res.data.state === 200) {
            // 隐藏模态框
            hideModalFrame(event, '#form-modal_frame', true);
            // 重置变化校验
            changeRules('reset');
            // 延迟定时器
            setTimeout(function () {
                // 刷新页面
                window.location.reload();
            }, 400);
        }
    }).catch(function (err) {
        // 消息提示
        message('add', 'error', err);
        // 删除加载
        actionLoading(_this, 'remove', 'submit');
    })
}

/**
 * 删除
 * @param {Type} _this 当前DOM
 * @param {Type} url 地址
 * @return void
 */
function onDelete(_this, url) {
    // 显示确认框
    confirmation(event, 'show', function () {
        // 隐藏确认框
        confirmation(event, 'hide');

        // 添加加载
        actionLoading(_this, 'add', 'icon');

        // 发送请求
        axios.delete(url).then(function (res) {
            // 消息提示
            message('add', res.data.type, res.data.message);

            // 删除加载
            actionLoading(_this, 'remove', 'icon');

            // 判断是否删除成功
            if (res.data.state === 200) $(_this).parents('.table-tr').remove();    // 删除数据
        }).catch(function (err) {
            // 消息提示
            message('add', 'error', err);

            // 删除加载
            actionLoading(_this, 'remove', 'icon');
        })
    })
}